﻿#include <iostream>
#include <vector>
using namespace std;

/*
C++实现：给定 N（可选作为埋伏点的建筑物数）、 D（相距最远的两名特工间的距离的最大值）以及可选建筑的坐标，计算在这次行动中，大锤的小队有多少种埋伏选择。
注意：
1. 两个特工不能埋伏在同一地点
2. 三个特工是等价的：即同样的位置组合( A , B , C ) 只算一种埋伏方法，不能因“特工之间互换位置”而重复使用
数据范围： 0<n,d≤10
输入描述：
第一行包含空格分隔的两个数字 N和D(1 ≤ N ≤ 1000000; 1 ≤ D ≤ 1000000)
第二行包含N个建筑物的的位置，每个位置用一个整数（取值区间为[0, 1000000]）表示，从小到大排列（将字节跳动大街看做一条数轴）
输出描述：
一个数字，表示不同埋伏方案的数量。结果可能溢出，请对 99997867 取模
示例1
输入例子：
4 3
1 2 3 4
输出例子：
4
*/

int test_z_02()
{
    int MOD = 99997867;
    int n, d;
    cin >> n >> d;
    vector<int> nums(n);
    for (int i = 0; i < n; i++) {
        cin >> nums[i];
    }
    int res = 0;
    int j = 1, k = 2;
    //不断移动左边界
    for (int i = 0; i < n - 2; i++) {
        //右边界最大(后面缩回)
        while (j < n && nums[j] - nums[i] <= d) {
            j++;
        }
        long long cnt = j - i - 1;  //缩回
        //满足条件再判断
        if (cnt >= 2) {
            //左边界站一人，另外两人在范围内任选
            int tmp = (cnt * (cnt - 1) / 2) % MOD;
            res = (res + tmp ) % MOD;
        }
    }
    cout << res << endl;
    return 0;
}
